草庐IT

c++ - constexpr 和 ODR

全部标签

c++ - 在某些情况下允许从 constexpr 调用非 constexpr 函数

来自那个问题:Howtobuildacustommacrothatbehavesdifferentlywhenusedasconstexpr(likeassert)?我想知道如果有条件的话为什么可以调用非constexpr函数。voidbla(){std::coutnotconstexpr!condition?void(0):bla();//compilesandrunsevenifconditionistrueorfalse!//ifconditionisconst,itdidnotcompilebecauseit//directlyforceexecutionofnonconste

c++ - constexpr 构造函数不会显示覆盖率数据

今天我将矩阵类重写为constexpr。我对这个类有100%的单元测试覆盖率,但我注意到在我将几乎所有函数转换为constexpr之后,构造函数的一部分在lcov中被标记为根本不再被覆盖。这是只有构造函数的类。templateclassMatrix{static_assert(std::is_arithmetic::value,"Matrixcanonlybedeclaredwithatypewhere""std::is_arithmeticistrue.");public:constexprMatrix(std::initializer_list>matrix_data){if(ma

c++ - 如何告诉 C++ 根据索引指示符放弃 vector 中的某些元素

我正在使用RCPP来加速我项目中的R代码。现在我正在做的是使用Armadillo包将我的R代码转换为C++。我发现我经常用C++编写多行来替换R中的一行...这是我的问题:我有一个vector存储数据:数据。我还有一个矩阵存储我需要访问的元素的索引。请允许我先用R说明我的场景:>Data[1]45678和>index[,1][,2][,3][1,]123[2,]100[3,]202对于“索引”矩阵的每一行,我想从数据中获取相应的元素。在R中,我只需要这样编码:>Data[index[1,]][1]456>Data[index[2,]][1]4>Data[index[3,]][1]55即

c++ - 仅使用 get 或 set 的原始类型的线程安全威胁是否被夸大了?

在过去的一周里,我在工作中一直在争论一个系统,在这个系统上,Cortex-A9上的double是从多个线程获取和设置的,没有线程安全的提示。它似乎工作正常,经过一些测试后,我无法让我的桌面在使用__int128的简单测试中失败。读取错误值的几率是否非零?如果可能性很大而我没有做对?任何在现代x86_64机器上反复失败的示例代码都很棒。但仅对基本类型使用get/set。 最佳答案 尝试运行这个:#include#include#includestd::arraysharedArray;voidtaskOne(){while(true)

c++ - 调用模板参数 constexpr 方法?

std::array::size()是非staticconstexpr方法;正在constexpr我可以将它用作模板参数:#include#includeintmain(void){std::arraya={{"Helloworld"}};std::coutb=a;std::cout但是,如果std::array是一个模板参数,事情变得不确定:templatevoidcopy(Tconst&a){std::arrayc=a;std::coutGCC愉快地编译这个[1],而CLANG拒绝[2]:6:20:error:non-typetemplateargumentisnotaconsta

c++ - gdb中的nexti和stepi有什么区别?

在使用gdb调试可执行文件时,我们可以使用两个命令逐步执行:stepi和下一步这两者之间有什么区别,为什么会有人选择其中一个?在gdb中使用帮助说:stepi:Steponeinstructionexactly.nexti:Steponeinstruction,butproceedthroughsubroutinecalls.因为我们在这里处理指令和机器代码(正在执行的程序的最小部分),所以我无法弄清楚子例程调用是什么。 最佳答案 stepi比nexti更详细.如果你调用sum()来自main()功能然后做stepi在sum()函数

c++ - 导致运行时执行的 constexpr 仿函数中的成员

我正在使用仿函数以下列方式生成编译时计算代码(对于长代码我深表歉意,但这是我发现重现该行为的唯一方法):#include#includetemplateconstexprautocompute(constdoubleh){std::tuple,std::array>paw{};autoxtab=std::get(paw).data();autoweight=std::get(paw).data();ifconstexpr(order==3){xtab[0]=-1.0E+00;xtab[1]=0.0E+00;xtab[2]=1.0E+00;weight[0]=1.0/3.0E+00;we

c++ - 为什么尽管使用了 -isystem,但 clang 在我的标题上报告了警告,而 gcc 没有报告?

与thisquestion稍微相关但不一样。在ArchLinux上使用clang7.0.1。我喜欢干净的代码,所以我想启用所有警告并将它们视为错误。问题是我的构建中有一些自动生成的文件不是没有警告,例如:生成/foo.hinlinevoidfoo(intunused){//warning:unusedparameter'unused'}生成/foo.cc#include"foo.h"//Thereisactualcodehere,butitdoesn'tmatter.由于这些文件是由第三方工具生成的,我不能轻易修改它们,所以我使用-isystem禁止来自generated的所有警告目录

c++ - 在 C/C++ 中存储 PCRE 编译的正则表达式

有没有一种有效的方法可以将编译后的正则表达式(通过regcomp()、PCRE编译)存储在二进制文件中,以便稍后我可以从文件中读取并调用regexec()?或者只是将编译后的regex_t结构转储到文件并在需要时读回它们? 最佳答案 除非你有super-complexregex,我几乎看不出序列化编译后的正则表达式有什么好处,编译时间应该不会那么长。除非你在一个超紧密的嵌入系统上?无论如何,确实倾倒结构可能是一个解决方案,至少你可以尝试...[编辑]我只是查看了我的源代码(6.7),正如我所担心的那样,它并不是那么简单,结构以voi

c++ - 如何使用 C++ 增加 Visual Studio 内部版本号?

我有一个生成名为“Game-Release.exe”的文件的VisualStudio2008项目。这是在ProjectProperties->C/C++->Linker->General下配置的:$(OutDir)\$(ProjectName)-Release.exe我想通过增加内部版本号来更进一步,所以我会说一些东西:Game-Release-Build-1002.exe最后的数字应该是一个递增的整数。我将在subversion上存储构建exe,所以我认为这很有用(尽管不是必需的)。也许VisualStudio中有一个内置宏可以处理这个问题。很可能我在想我可以有一个包含内部版本号的文